package com.by.result;

/**
 * 通用结果封装类，用于封装接口返回的状态码、消息和数据。
 * @param <T> 数据的类型
 */
public class Result<T> {
    private int code;    // 状态码
    private String msg;  // 消息
    private T data;      // 数据

    /**
     * 构造方法，用于创建一个包含状态码、消息和数据的Result对象。
     *
     * @param code 状态码，表示操作的结果状态
     * @param msg  消息，描述操作的结果信息
     * @param data 数据，操作返回的具体数据
     */
    public Result(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 成功方法，用于创建一个表示操作成功的Result对象。
     *
     * @param data 操作返回的具体数据
     * @param <T>  数据的类型
     * @return 返回一个状态码为200，消息为"Success"的Result对象
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(ResultCode.SUCCESS, "Success", data);
    }

    /**
     * 成功方法，用于创建一个表示操作成功的Result对象，带有自定义消息。
     *
     * @param msg  自定义成功消息
     * @param data 操作返回的具体数据
     * @param <T>  数据的类型
     * @return 返回一个状态码为200，带有自定义消息的Result对象
     */
    public static <T> Result<T> success(String msg, T data) {
        return new Result<>(ResultCode.SUCCESS, msg, data);
    }

    /**
     * 失败方法，用于创建一个表示操作失败的Result对象。
     *
     * @param code 状态码，表示操作失败的具体原因
     * @param msg  消息，描述操作失败的详细信息
     * @param <T>  数据的类型
     * @return 返回一个包含指定状态码和消息的Result对象，数据为null
     */
    public static <T> Result<T> error(int code, String msg) {
        return new Result<>(code, msg, null);
    }

    // Getters and Setters
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}